"""
@Author  : 康帅
@Time    : 2021/6/16 14:26
@Function: 
"""
import functools

"""
partial 对象默认并没有 __name__ 或者 __doc__ 属性，
如果没有这些属性，装饰功能就更难以调试。
我们可以使用 update_wrapper() 方法将原方法的属性复制或添加新属性到 partial 对象
"""


def my_func(a, b=2):
    """my_func()的文档字符串"""
    print(f'调用my_func的参数{a, b}')


def show_details(name, f):
    """显示一个可调用对象的细节"""
    print(f'{name}')
    print(f'object:{f}')
    print('__name__:', end=' ')
    try:
        print(f.__name__)
    except AttributeError:
        print('no __name__')
    print('__doc__', repr(f.__doc__))
    print()


show_details('my_func', my_func)
p1 = functools.partial(my_func, b=4)
show_details('raw wrapper', p1)


print('Updating wrapper:')
print('assign:', functools.WRAPPER_ASSIGNMENTS)
print('update:', functools.WRAPPER_UPDATES)
print()

functools.update_wrapper(p1, my_func)
show_details('updated wrapper', p1)
